# -*- coding: utf-8 -*- 
# @Time : 2023/6/18 17:11 
# @Author : gkm
# @File : file.py
from django import forms
from django.core.exceptions import ValidationError

from web.forms.bootstrap import BootStrapForm
from web import models

from utils.tencent.cos import check_file


class FolderModelForm(BootStrapForm, forms.ModelForm):
    class Meta:
        model = models.FileRepository
        fields = ['name']

    def __init__(self, request, parent_object, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.request = request
        self.parent_object = parent_object

    def clean_name(self):
        name = self.cleaned_data['name']
        # 判断当前目录下文件夹是否重名/存在
        queryset = models.FileRepository.objects.filter(file_type=2, name=name, project=self.request.tracer.project)
        if self.parent_object:
            exist = queryset.filter(parent_object=self.parent_object).exists()
        else:
            exist = queryset.filter(parent__isnull=True).exists()
        if exist:
            raise ValidationError("文件夹已存在")
        return name


class FileModelForm(forms.ModelForm):
    etag = forms.CharField(label='ETag')

    class Meta:
        model = models.FileRepository()
        exclude = ['project', 'file_type', 'update_user', 'update_datetime']

    def __init__(self, request, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.request = request

    def clean_file_type(self):
        return "https://{}".format(self.cleaned_data["file_path"])

    """
        def clean(self):
        key = self.cleaned_data["key"]
        etag = self.cleaned_data["etag"]
        size = self.cleaned_data['file_size']
        if not key or not etag:
            return self.cleaned_data

        # COS校验是否合法
        # SDK功能
        from qcloud_cos.cos_exception import CosServiceError
        try:
            result = check_file(self.request.tracer.project.bucket, self.request.tracer.project.region, key)
        except CosServiceError as e:
            self.add_error("key", "文件不存在")
            return self.cleaned_data

        cos_etag = result.get["etag"]
        if etag != cos_etag:
            self.add_error("etag", "ETag错误")

        cos_length = result.get("Content-Length")
        if int(cos_length) != size:
            self.add_error("file_size", "文件大小错误")
        return self.cleaned_data
    """
